package org.jbehave.core.steps; import org.apache.commons.lang3.StringEscapeUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.text.WordUtils; import org.jbehave.core.annotations.Pending; import org.jbehave.core.configuration.Keywords; import org.jbehave.core.steps.StepCreator.PendingStep; import static java.text.MessageFormat.format; public class PendingStepMethodGenerator { private static final String METHOD_SOURCE = "@{0}(\"{1}\")\n@{2}\npublic void {3}() '{'\n // {4}\n'}'\n"; private final Keywords keywords; public PendingStepMethodGenerator(Keywords keywords) { this.keywords = keywords; } public String generateMethod(PendingStep step) { String stepAsString = step.stepAsString(); String previousNonAndStepAsString = step.previousNonAndStepAsString(); StepType stepType = null; if (keywords.isAndStep(stepAsString) && previousNonAndStepAsString != null) { stepType = keywords.stepTypeFor(previousNonAndStepAsString); } else { stepType = keywords.stepTypeFor(stepAsString); } String stepPattern = keywords.stepWithoutStartingWord(stepAsString, stepType); String stepAnnotation = StringUtils.capitalize(stepType.name().toLowerCase()); String methodName = methodName(stepType, stepPattern); String pendingAnnotation = Pending.class.getSimpleName(); return format(METHOD_SOURCE, stepAnnotation, StringEscapeUtils.escapeJava(stepPattern), pendingAnnotation, methodName, keywords.pending()); } private String methodName(StepType stepType, String stepPattern) { String name = stepType.name().toLowerCase() + WordUtils.capitalize(stepPattern); char filteredName[]=new char[name.length()]; int index=0; for(int i=0;i<name.length();i++) { char ch=name.charAt(i); if(Character.isJavaIdentifierPart(ch) && ch!='$' && ch!=127) { filteredName[index++]=ch; } } return new String(filteredName,0,index); } }